[1]:

from IPython.display import IFrame

# Youtube
IFrame("https://www.youtube.com/embed/v-91XHpjugo", "100%", 500)

[1]:

Configurações

[2]:
import numpy as np
import pandas as pd
from scipy.integrate import odeint

from bokeh.palettes import brewer
from bokeh.plotting import figure, show
from bokeh.io import output_notebook

output_notebook()
Loading BokehJS ...

Suscetível, Infectado e Removido (Recuperado)

A proposta é introduzir um modelo determinístico para análise de evolução de uma epidemia. O modelo aqui representado foi inicialmente proposto por Kermack, W. and McKendrick, A., 1927. A contribution to the mathematical theory of epidemics. Proc. R. Soc. London A 115, 700-721. O modelo tem as seguintes premissas:

  1. Uma posulação invariante no tempo com N individuos (fechada).
  2. Taxas constantes: contato e remoção.
  3. Desconsiderando variações demográficas: nascimentos e mortes.
  4. População “bem misturada”.

O modelo é fundamentado em três estados: S - suscetível, I - infectado e R - removido ou recuperado.

\[S(t)+I(t)+R(t)= N\]
[3]:

# Tamanho da populção - N
N = 500

# Valores iniciais
I0 = 1
R0 = 0
S0 = N - I0

O conjunto de equações diferenciais que caracteriza o modelo é descrito abaixo. No modelo

\[\beta - \text{representa a taxa de transmissão ou taxa efetiva de contato}\]

e

\[r - \text{a taxa de remoção ou recuperação.}\]
\[\begin{split}\begin{split} \frac{dS(t)}{dt} & = -\beta S(t) I(t) \\ \frac{dI(t)}{dt} & = \beta S(t) I(t) - rI(t) \\ \frac{dR(t)}{dt} & = r I(t) \end{split}\end{split}\]
[4]:

# Definição do conjunto de equações diferencias não lineares que formam o modelo.

def SIRm(y, t, N, Beta, r):
    S, I, R = y
    Sdot = -(Beta * S * I)
    Idot = (Beta * S * I)  - r * I
    Rdot = r * I
    return Sdot, Idot, Rdot

Analisando a evolução de \(\beta\) e \(r\)

[5]:

# Beta -  taxa de contato,
# r - taxa média de recuperação (in 1/dia).
Beta = 0.0009
r = 1e-1

# Resolução da simulação - Escala temporal (dias)
t = np.linspace(0, 100, 1000)

# Vetor de condições iniciais
y0 = S0, I0, R0

# Integrando as Equações do modelo SIR
ret = odeint(SIRm, y0, t, args=(N, Beta, r))
S, I, R = ret.T

# Visualizando a evolução da Epidemia - S(t), I(t) e R(t)
p = figure(tools="pan,hover,lasso_select",
           x_range=(0, t[-1]), y_range=(0, N),
           plot_width=600, plot_height=400)

p.line(t, S, legend_label="Suscetíveis", color="#ffd885", line_width=3)
p.line(t, I, legend_label="Infectados",  color="#de425b", line_width=3)
p.line(t, R, legend_label="Removidos",   color="#99d594", line_width=3)

p.grid.grid_line_alpha = 0
p.ygrid.band_fill_color = "olive"
p.ygrid.band_fill_alpha = 0.1
p.yaxis.axis_label = "Indivíduos"
p.xaxis.axis_label = "Dias"
p.legend.click_policy = "mute"
p.legend.items.reverse()

show(p)

Salvando o modelo

[6]:

import pandas as pd

output = pd.DataFrame({"S": S, "I": I, "R": R})
output.to_csv('SIRpd', index=False)

print(output)

              S         I           R
0    499.000000  1.000000    0.000000
1    498.954252  1.035561    0.010187
2    498.906883  1.072381    0.020736
3    498.857833  1.110506    0.031660
4    498.807046  1.149981    0.042973
..          ...       ...         ...
995    5.855617  0.232760  493.911622
996    5.855495  0.230564  493.913941
997    5.855374  0.228388  493.916238
998    5.855254  0.226232  493.918514
999    5.855135  0.224097  493.920768

[1000 rows x 3 columns]